package Model;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import javax.persistence.*; 
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch; 
import org.hibernate.annotations.FetchMode; 

@Entity
@Table(name="endereco")
@SuppressWarnings ("serial")
public class Endereco implements Serializable
{
    @Id
    @SequenceGenerator( name = "cod_endereco", sequenceName = "cod_endereco_seq", allocationSize = 1 )   
    @GeneratedValue( strategy = GenerationType.SEQUENCE, generator = "cod_endereco" )   
    @Column (name = "cod_endereco")
    private int codEndereco;

    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name="cod_cidade") 
    @Fetch(FetchMode.SELECT)
    private Cidade cidade;

    @Column (name = "logradouro")  // O campo rua inclue a rua e o numero da casa
    private String logradouro;

    @Column (name = "bairro")
    private String bairro;

    @Column (name = "cep")
    private String cep;
    
    @Column (name = "complemento")
    private String complemento;

    @OneToMany(mappedBy="endereco", fetch = FetchType.EAGER)
    @Fetch(FetchMode.SELECT)
    @Cascade(CascadeType.LOCK)
    private Collection <Associacao> associacao;

    @OneToMany(mappedBy="endereco", fetch = FetchType.EAGER)
    @Fetch(FetchMode.SELECT)
    @Cascade(CascadeType.LOCK)
    private Collection <Associado> associado;
    
    @OneToMany(mappedBy="endereco", fetch = FetchType.EAGER)
    @Cascade(CascadeType.LOCK)
    @Fetch(FetchMode.SELECT)
    private Collection <Empresa> empresa;

    //Construtores
    //consturtor padrao
    public Endereco (){
       this.codEndereco = 0;
        this.cidade = new Cidade();
        this.logradouro = "";
        this.bairro = "";
        this.cep = "";
        this.complemento = "";
    }
    //Construtor com parametros
    public Endereco (int codEndereco, Cidade cidade, String logradouro,String bairro, String cep, String complemento)
    {             
        this.codEndereco = codEndereco;
        this.cidade = cidade;
        this.logradouro = logradouro;
        this.bairro = bairro;
        this.cep = cep;
        this.complemento = complemento;
    }
    //Construtor que busca um objeto na base de dados

    //Metodos Get e Set
    public int getCodEndereco() {
        return codEndereco;
    }
    public void setCodEndereco(int codEndereco) {
        this.codEndereco = codEndereco;
    }
    
    public Cidade getCidade() {
        return cidade;
    }
    public void setCidade(Cidade cidade) {
        this.cidade = cidade;
    }

    public String getLogradouro() {
        return logradouro;
    }
    public void setLogradouro(String logradouro) {
        this.logradouro = logradouro;
    }

    public String getBairro() {
        return bairro;
    }
    public void setBairro(String bairro) {
        this.bairro = bairro;
    }

    public String getCep() {
        return cep;
    }
    public void setCep(String cep) {
        this.cep = cep;
    }

    public String getComplemento() {
        return complemento;
    }
    public void setComplemento(String complemento) {
        this.complemento = complemento;
    }

    public Collection<Associacao> getAssociacao() {
        return associacao;
    }
    public void setAssociacao(Collection<Associacao> associacao) {
        this.associacao = associacao;
    }

    public Collection<Associado> getAssociado() {
        return associado;
    }
    public void setAssociado(Collection<Associado> associado) {
        this.associado = associado;
    }

    public Collection<Empresa> getEmpresa() {
        return empresa;
    }
    public void setEmpresa(Collection<Empresa> empresa) {
        this.empresa = empresa;
    }
}
